#include <iostream>

//成员函数指针模板参数
//1、成员函数指针本意：提供一种运行时类型为可变的多态机制
//2、直接调用类的成员函数，目的之从不同的成员函数操作中提取出共性
class some_value;

typedef int (some_value::* some_value_mfp)(int);

template<some_value_mfp func> //func是一个成员函数指针型模板参数
int call(some_value &value, int op) {return (value.*func)(op);}// .* 和 ->* 

class some_value
{
    int value;
public:
    some_value(int _value) : value(_value) {}
    int add_by(int op) {return value += op;}
    int sub_by(int op) {return value -= op;}
    int mul_by(int op) {return value *= op;}
};

int main()
{
    using namespace std;
    some_value v0(0);
    // 以下调用时直接调用类的成员函数，提取出成员函数调用的共同性，
    cout << call<&some_value::add_by>(v0, 1) << endl;// & 取地址符不能省略
    cout << call<&some_value::sub_by>(v0, 2) << endl;
    cout << call<&some_value::mul_by>(v0, 3) << endl;
}
